using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace AvaAI批量点评系统.Services;

/// <summary>
/// 阿里云通义千问视觉模型服务 - 专门用于图像识别
/// 使用 qwen-vl-max-latest 模型，具有更强的图像理解能力
/// </summary>
public class QwenVLService
{
    private readonly HttpClient _httpClient;
    private readonly string _apiKey;
    private readonly string _baseUrl;

    public QwenVLService()
    {
        _httpClient = new HttpClient();
        // 从环境变量获取API Key，如果没有则使用默认值
        _apiKey = Environment.GetEnvironmentVariable("DASHSCOPE_API_KEY") ?? "sk-ae11c7a8f0494eec84a47b2516da5a95";
        _baseUrl = "https://dashscope.aliyuncs.com/compatible-mode/v1";
        
        _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {_apiKey}");
        _httpClient.DefaultRequestHeaders.Add("User-Agent", "AvaAI-VisionSystem/1.0");
    }

    /// <summary>
    /// 使用 qwen-vl-max-latest 模型分析图像
    /// </summary>
    /// <param name="base64Image">Base64编码的图像数据</param>
    /// <param name="prompt">分析提示词</param>
    /// <param name="imageFormat">图像格式 (png, jpeg, webp)</param>
    /// <returns>分析结果</returns>
    public async Task<string> AnalyzeImageAsync(string base64Image, string prompt, string imageFormat = "png")
    {
        var requestBody = new
        {
            model = "qwen-vl-max-latest", // 使用视觉模型
            messages = new[]
            {
                new
                {
                    role = "user",
                    content = new object[]
                    {
                        new
                        {
                            type = "image_url",
                            image_url = new 
                            { 
                                url = $"data:image/{imageFormat};base64,{base64Image}" 
                            }
                        },
                        new
                        {
                            type = "text",
                            text = prompt
                        }
                    }
                }
            },
            max_tokens = 1000,
            temperature = 0.7, // 与omini保持一致
            stream = true  // 启用流式输出，与omini保持一致
        };

        var json = JsonConvert.SerializeObject(requestBody);
        var content = new StringContent(json, Encoding.UTF8, "application/json");

        try
        {
            var response = await _httpClient.PostAsync($"{_baseUrl}/chat/completions", content);
            
            if (response.IsSuccessStatusCode)
            {
                var responseContent = await response.Content.ReadAsStringAsync();
                
                // 首先尝试流式解析
                var streamResult = ParseStreamResponse(responseContent);
                
                // 如果流式解析失败或返回空内容，尝试普通解析
                if (streamResult.Contains("无法解析") || streamResult.Contains("解析失败") || string.IsNullOrWhiteSpace(streamResult))
                {
                    var normalResult = ParseResponse(responseContent);
                    return string.IsNullOrWhiteSpace(normalResult) ? 
                        $"VL-Max模型响应解析失败\n流式解析结果: {streamResult}\n普通解析结果: {normalResult}" : 
                        normalResult;
                }
                
                return streamResult;
            }
            else
            {
                var errorContent = await response.Content.ReadAsStringAsync();
                return $"API调用失败: {response.StatusCode} - {errorContent}";
            }
        }
        catch (Exception ex)
        {
            return $"网络错误: {ex.Message}";
        }
    }

    /// <summary>
    /// 专门用于识别学生点名表的优化方法
    /// </summary>
    /// <param name="base64Image">Base64编码的图像数据</param>
    /// <param name="imageFormat">图像格式</param>
    /// <returns>识别结果</returns>
    public async Task<string> AnalyzeStudentRosterAsync(string base64Image, string imageFormat = "png")
    {
        var detailedPrompt = "请仔细分析这张图片，这是一张学生点名表、课程名单或课程表的照片。\n\n" +
                           "**重要分析要求：**\n" +
                           "1. **课程名称识别**：查找课程标题、科目名称（如：乐高机器人搭建、科学实验、GESP图形化编程、传感器搭建、3D打印笔模型设计、智能穿越机器人、趣味思维、创意创客电路、车航模等）\n\n" +
                           "2. **年级信息识别**：查找年级标识（如：一年级、二年级、三年级、四年级、五年级、六年级，或1-3年级这样的范围表示）\n\n" +
                           "3. **难度等级识别**：查找难度标识（如：入门、基础、提高、竞赛、初级、中级、高级等）\n\n" +
                           "4. **学生姓名识别**：**这是最重要的部分**\n" +
                           "   - 仔细识别图片中的所有中文学生姓名\n" +
                           "   - 学生姓名通常是2-4个汉字组成\n" +
                           "   - 可能以列表形式、表格形式或段落形式出现\n" +
                           "   - 注意区分学生姓名和其他文字（如课程名称、说明文字等）\n" +
                           "   - 包括手写字体和打印字体的姓名\n\n" +
                           "5. **学生数量统计**：统计识别到的学生总数\n\n" +
                           "**严格按照以下格式输出，不要添加其他解释性内容：**\n\n" +
                           "课程名称：[具体的课程名称]\n" +
                           "年级：[具体的年级信息]\n" +
                           "难度等级：[具体的难度等级]\n" +
                           "学生总数：[数字]\n" +
                           "学生姓名：[姓名1、姓名2、姓名3...]\n\n" +
                           "**特别注意事项：**\n" +
                           "- 如果某项信息无法清晰识别，请填写\"未识别\"\n" +
                           "- 学生姓名请务必仔细识别，这是核心任务\n" +
                           "- 多个姓名用中文顿号\"、\"分隔\n" +
                           "- 确保识别的是真实的中文人名，不要包含课程名称或其他词汇\n" +
                           "- 如果图片模糊或部分姓名不清楚，请尽力识别清晰可见的部分";

        return await AnalyzeImageAsync(base64Image, detailedPrompt, imageFormat);
    }

    /// <summary>
    /// 快速图像内容识别（用于预览）
    /// </summary>
    /// <param name="base64Image">Base64编码的图像数据</param>
    /// <param name="imageFormat">图像格式</param>
    /// <returns>快速识别结果</returns>
    public async Task<string> QuickAnalyzeAsync(string base64Image, string imageFormat = "png")
    {
        var quickPrompt = "请简要描述这张图片的主要内容，特别关注是否包含学生名单、课程信息等教育相关内容。用50字以内概括。";
        
        return await AnalyzeImageAsync(base64Image, quickPrompt, imageFormat);
    }

    /// <summary>
    /// 解析流式API响应（与AliCloudAIService保持一致）
    /// </summary>
    /// <param name="streamContent">流式响应内容</param>
    /// <returns>解析后的文本内容</returns>
    private string ParseStreamResponse(string streamContent)
    {
        try
        {
            var lines = streamContent.Split('\n', StringSplitOptions.RemoveEmptyEntries);
            var contentBuilder = new StringBuilder();

            foreach (var line in lines)
            {
                if (line.StartsWith("data: "))
                {
                    var jsonData = line.Substring(6); // 移除 "data: " 前缀
                    
                    // 跳过结束标记
                    if (jsonData.Trim() == "[DONE]")
                        continue;

                    try
                    {
                        var chunk = JsonConvert.DeserializeObject<dynamic>(jsonData);
                        var delta = chunk?.choices?[0]?.delta;
                        var content = delta?.content?.ToString();
                        
                        if (!string.IsNullOrEmpty(content))
                        {
                            contentBuilder.Append(content);
                        }
                    }
                    catch
                    {
                        // 忽略无法解析的数据块
                        continue;
                    }
                }
            }

            var result = contentBuilder.ToString();
            return string.IsNullOrEmpty(result) ? "无法解析流式响应" : result;
        }
        catch (Exception ex)
        {
            return $"解析流式响应失败: {ex.Message}";
        }
    }

    /// <summary>
    /// 解析普通API响应（备用方法）
    /// </summary>
    /// <param name="responseContent">响应内容</param>
    /// <returns>解析后的文本内容</returns>
    private string ParseResponse(string responseContent)
    {
        try
        {
            var responseObj = JsonConvert.DeserializeObject<dynamic>(responseContent);
            
            // 检查是否有错误
            if (responseObj?.error != null)
            {
                return $"API错误: {responseObj.error.message}";
            }

            // 提取回复内容
            var content = responseObj?.choices?[0]?.message?.content?.ToString();
            
            if (!string.IsNullOrEmpty(content))
            {
                return content.Trim();
            }
            else
            {
                return "API返回了空的响应内容";
            }
        }
        catch (Exception ex)
        {
            return $"解析API响应失败: {ex.Message}\n原始响应: {responseContent}";
        }
    }

    /// <summary>
    /// 检测图像格式
    /// </summary>
    /// <param name="base64Image">Base64编码的图像数据</param>
    /// <returns>图像格式 (png, jpeg, webp)</returns>
    public string DetectImageFormat(string base64Image)
    {
        try
        {
            // 解码前几个字节来判断文件格式
            var bytes = Convert.FromBase64String(base64Image.Substring(0, Math.Min(base64Image.Length, 100)));
            
            // PNG 文件头: 89 50 4E 47
            if (bytes.Length >= 4 && bytes[0] == 0x89 && bytes[1] == 0x50 && bytes[2] == 0x4E && bytes[3] == 0x47)
                return "png";
            
            // JPEG 文件头: FF D8 FF
            if (bytes.Length >= 3 && bytes[0] == 0xFF && bytes[1] == 0xD8 && bytes[2] == 0xFF)
                return "jpeg";
            
            // WebP 文件头: 在第8-11字节是 "WEBP"
            if (bytes.Length >= 12)
            {
                var webpSignature = Encoding.ASCII.GetString(bytes, 8, 4);
                if (webpSignature == "WEBP")
                    return "webp";
            }
            
            // 默认返回 png
            return "png";
        }
        catch
        {
            // 如果检测失败，默认返回 png
            return "png";
        }
    }

    /// <summary>
    /// 获取模型信息
    /// </summary>
    /// <returns>模型信息字符串</returns>
    public string GetModelInfo()
    {
        return "qwen-vl-max-latest - 阿里云通义千问视觉大模型（已优化）\n" +
               "• 专门优化的图像理解能力\n" +
               "• 支持复杂场景的文字识别\n" +
               "• 更准确的中文姓名识别\n" +
               "• 支持手写和打印文字混合识别\n" +
               "• 已统一流式响应处理，提升识别稳定性";
    }

    public void Dispose()
    {
        _httpClient?.Dispose();
    }
} 